package bit_pratice.day10;

/**
 * 给定一个二维数组board，代表棋盘，其中元素为1的代表是当前玩家的棋子，0表示没有棋子，-1代表是对方玩家的棋子。
 * 当一方棋子在横竖斜方向上有连成排的及获胜（及井字棋规则），返回当前玩家是否胜出。
 **/
public class 井字棋 {
    public boolean checkWon(int[][] board) {
        // write code here
        //检查行列主副对角线是否连成了线即可
        //1表示当前玩家下的棋，那么一行一列或一对角线的和等于行/列/对角线长度即可说明当前玩家获胜，否则都不能说明
        int n=board.length;//行列数
        int sum=0;//统计所有列/行/对角线上1的和
        //判断行
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                sum+=board[i][j];
            }
            //遍历1行，判断这一次这一行是否满足条件
            if(sum==n){
                return true;
            }
        }
        //判断列
        sum=0;//sum得清空再进行判断
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                sum+=board[j][i];//列是列不变行变达到遍历1列的效果
            }
            //遍历一列，判断这一次这一行是否满足条件
            if(sum==n){
                return true;
            }
        }
        //遍历主对角线
        sum=0;
        for(int i=0;i<n;i++){
            sum+=board[i][i];//列是列不变行变达到遍历1列的效果
        }
        if(sum==n){
            return true;
        }
        //遍历副对角线
        sum=0;
        for(int i=0;i<n;i++){
            sum+=board[i][n-i-1];
        }
        if(sum==n){
            return true;
        }
        return false;
    }
}
